package functions

import "fmt"

// 基本函数
func add(a, b int) int {
	return a + b
}

// 多返回值函数
func divide(a, b float64) (float64, error) {
	if b == 0 {
		return 0, fmt.Errorf("除数不能为零")
	}
	return a / b, nil
}

// 命名返回值
func calculate(a, b int) (sum, product int) {
	sum = a + b
	product = a * b
	return // 不需要显式指定返回值
}

// 变参函数
func sumNumbers(numbers ...int) int {
	total := 0
	for _, num := range numbers {
		total += num
	}
	return total
}

// 函数作为参数
func applyOperation(a, b int, op func(int, int) int) int {
	return op(a, b)
}

// 闭包函数
func makeMultiplier(factor int) func(int) int {
	return func(x int) int {
		return x * factor
	}
}

// DemoFunctions 展示各种函数特性
func DemoFunctions() {
	// 基本函数调用
	result := add(3, 5)
	fmt.Println("3 + 5 =", result)
	
	// 多返回值函数调用
	divResult, err := divide(10, 2)
	if err != nil {
		fmt.Println("除法错误:", err)
	} else {
		fmt.Println("10 / 2 =", divResult)
	}
	
	// 命名返回值
	sum, product := calculate(4, 5)
	fmt.Println("4 + 5 =", sum, ", 4 * 5 =", product)
	
	// 变参函数
	total := sumNumbers(1, 2, 3, 4, 5)
	fmt.Println("1+2+3+4+5 =", total)
	
	// 函数作为参数
	subtract := func(a, b int) int {
		return a - b
	}
	diff := applyOperation(10, 4, subtract)
	fmt.Println("10 - 4 =", diff)
	
	// 闭包
	triple := makeMultiplier(3)
	fmt.Println("5 * 3 =", triple(5))
	
	double := makeMultiplier(2)
	fmt.Println("7 * 2 =", double(7))
}
